/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.mybank.bo.impl;

import org.junit.Before;
import com.mybank.dao.ClienteDao;
import com.mybank.bo.exception.ClienteNulo;
import org.springframework.test.context.ContextConfiguration;
import com.mybank.domain.Cliente;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import static org.junit.Assert.*;
import static org.mockito.Mockito.*;

/**
 *
 * @author mjcali
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:mybank-business.xml"})
public class ClienteBoImplTest {

    private ClienteBoImpl instance;
    private Cliente cliente;
    private ClienteDao clienteDaoMock;

    @Before
    public void setUp() {
        instance = new ClienteBoImpl();
        clienteDaoMock = mock(ClienteDao.class);
        instance.setClienteDao(clienteDaoMock);
        cliente = new Cliente();
    }

    @Test
    public void buscarCliente_condicionesCorrectas_retornaCliente() throws ClienteNulo {

        /*
         * Preparamos
         */
        String idCliente = "1";
        String nombre = "Carlos";
        String apellido = "Benitez";
        String documento = "22222222";

        cliente.setId(idCliente);
        cliente.setNombre(nombre);
        cliente.setApellido(apellido);
        cliente.setDocumento(documento);

        when(instance.getClienteDao().buscarCliente(idCliente)).thenReturn(cliente);

        /*
         * Ejecutamos
         */
        cliente = instance.buscarCliente(idCliente);

        /*
         * Verificamos
         */
        assertNotNull(cliente);
        assertEquals(cliente.getId(), idCliente);
        assertEquals(cliente.getApellido(), apellido);
        assertEquals(cliente.getNombre(), nombre);
        assertEquals(cliente.getDocumento(), documento);
    }

    @Test
    public void buscarCliente_clienteInexistente_retornaNull() throws ClienteNulo {
        /*
         * Preparamos
         */
        String idCliente = "111";
        when(instance.getClienteDao().buscarCliente(idCliente)).thenReturn(null);

        /*
         * Ejecutamos
         */
        cliente = instance.buscarCliente(idCliente);

        /*
         * Verificamos
         */
        assertNull(cliente);
    }

    @Test(expected = ClienteNulo.class)
    public void buscarCliente_clienteNulo_lanzaExcepcionClienteNulo() throws ClienteNulo {
        /*
         * Preparamos
         */
        when(instance.getClienteDao().buscarCliente(null)).thenThrow(new ClienteNulo());

        /*
         * Ejecutamos
         */
        instance.buscarCliente(null);
        fail("Debería haber lanzado la excepción ClienteNulo ");
    }
}
